import axios from 'axios'
import type { AxiosRequestConfig, AxiosError } from 'axios'
import router from "@/router";
// const service = axios.create({
//   baseURL: import.meta.env.VITE_API_BASE_URL,
//   timeout: 30 * 1000,
//   // 请求是否携带cookie
//   withCredentials: true
// })
console.log('process',import.meta.env)
var baseURL = import.meta.env.VITE_API_HOST;
if (import.meta.env.NODE_ENV == "development") {
  baseURL = import.meta.env.VITE_API_HOST;
} else {
  baseURL = import.meta.env.VITE_APP_BASEURL;
}
const service = axios.create({
  baseURL: baseURL,
  timeout: 60000,
});
// 请求拦截器
service.interceptors.request.use(
  (config:any) => {
    // 可以处理token等
    if (config.url.startsWith("/assets")) {
      config.url = window.location.origin + config.url;
    }
    config.headers["access_token"] =
      localStorage.getItem("user") && JSON.parse(localStorage.getItem("user")||"")
        ? JSON.parse(localStorage.getItem("user")||"").accessToken
        : "";
    if (process.env.NODE_ENV == "production") {
      if (
        localStorage.getItem("deviceInfo") &&
        JSON.parse(localStorage.getItem("deviceInfo")||"")
      ) {
        config.headers["versionCode"] = JSON.parse(
          localStorage.getItem("deviceInfo")||""
        ).appVersion;
      }
    }
    return config
  },
  (err) => {
    return Promise.reject(err)
  }
)

// 响应拦截器
service.interceptors.response.use(
  (response) => {
    const { status } = response
    if (status < 200 || status >= 300) {
      // 统一处理http错误，或者处理后抛到业务代码 TODO
    }

    return response
  },
  (err) => {
    const { status } = err.response

    // 根据返回的http状态码做不同的处理，比如错误提示等 TODO
    switch (status) {
      case 401:
        // 鉴权失败
         // 401 清除token信息并跳转到登录页面
          // store.dispatch(USER_SIGNOUT)
          router.replace({
            path: "/login",
            query: {
              from: router.currentRoute.value.fullPath.startsWith("/login")
                ? undefined
                : router.currentRoute.value .fullPath,
            },
          });
          throw new Error("会话已过期，请重新登录");
        break
      case 500:
        // 没有权限
        break
      case 502:
        // 服务端错误
        break
      case 503:
        throw new Error("网络繁忙，请稍后再试！");
        // 服务端错误
      case 504:
        throw new Error("访问超时，请稍后再试！");
        // 服务端错误
      default:
        break
    }

    return Promise.reject(err)
  }
)

// 封装一层以更好的统一定义接口返回的类型
const request = <T>(
  config: AxiosRequestConfig
): Promise<T> => {
  return new Promise((resolve, reject) => {
    service
      .request<T>(config)
      .then((res) => {
        resolve(res.data)
      })
      .catch((err: Error | AxiosError) => {
        reject(err)
      })
  })
}

export default request

